
package com.ys.chatserver.http.file.u;

import com.eva.epc.common.file.FileHelper;
import com.eva.framework.utils.LoggerFactory;
import com.ys.chatserver.BaseConf;
import com.ys.chatserver.http.logic.LogicProcessor2;
import com.ys.chatserver.tool.ImgEqualScaleAndCutHelper;

import java.util.HashMap;

/**
 * 用户头像上传实现类.
 *
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class UserAvatarUploader extends UploaderRoot {
    @Override
    protected String getFileSaveDir() {
        return BaseConf.getInstance().getDIR_USER_AVATAR_UPLOAD();
    }

    @Override
    protected void onUploadSucess(HashMap<String, Object> parametersFromClient) throws Exception {
        String userUid = (String) parametersFromClient.get("user_uid");
        // 因为服务端是支持多文件上传的API，所以客户端单独把文件名带过来了，方便使用！
        String fileName = (String) parametersFromClient.get("file_name");
        // 客户端传过来的token，用于请求的合法性检查，当前未作强制检查，留作以后使用
        String token = (String) parametersFromClient.get("token");

        LoggerFactory.getLog().debug("[" + getDebugTAG() + "] 用户" + userUid + "的头像文件" + fileName
                + "数据上传成功，马上处理其它业务逻辑...(token=" + token + ")");

        // 客户端传过来的数据（参数）的合法性检查
        if (userUid != null && fileName != null) {
            // ## 不需要写回数据（因为客户端有一定几率发生：EOFException错误，发生于
            // ## httpURLConnection.getResponseCode()这样尝试读取返回数据时，具体原因花了很多时间但未确知！
            // ## 那么现在的实现是干脆让客户端不尝试读取返回数据，实际上上传文件时没有必要有数据返回，客户端也不需要读取！）
////		request.setAttribute("message", "Upload has been done successfully!");
//			PrintWriter writer = response.getWriter();
//			writer.println("Upload has been done successfully!");
//			writer.flush();

            // 用户新头像数据成功保存成文件之后要做的事：删除老头像文
            // 件并把最新的文件名更新到用户数据表中
            afterSavedAvatarFile(userUid, fileName);
        } else {
            throw new Exception("[" + getDebugTAG() + "] 无效的参数：userUid=" + userUid + ", fileName=" + fileName + ".");
        }
    }

    @Override
    protected void onUploadFailure(Exception ex) {
        LoggerFactory.getLog().error("[" + getDebugTAG() + "] 处理用户头像上传时出错了，" + ex.getMessage(), ex);
    }

    @Override
    protected String getDebugTAG() {
        return "HTTP头像上传";
    }

    /**
     * 用户新头像数据成功保存成文件之后要做的事：删除老头像文件并把最新的文件名更新到用户数据表中等.
     *
     */
    public static void afterSavedAvatarFile(String userUid, String fileName) throws Exception {
        try {
            // 尝试生成新头像的缩略图(@since 4.3)
            // @since 4.3：当前生成的缩略图仅用于在群聊头像拼合时提升服务端性能等，暂无它用！
            try {
                String newFilePath = BaseConf.getInstance().getDIR_USER_AVATAR_UPLOAD() + fileName;
                String newFileThumbPath = BaseConf.getInstance().getDIR_USER_AVATAR_UPLOAD()
                        + "th_" + fileName;

                // 20170306后的缩略图生成算法
                ImgEqualScaleAndCutHelper.saveImageAsJpg(newFilePath, newFileThumbPath
                        , 120, 120);
            } catch (Exception e) {
                LoggerFactory.getLog().warn(e.getMessage(), e);
            }

            // 尝试去删除用户之前的老头像（新头像已上传，则老头像就没有意义了）
            String oldUserAvatarFileName = LogicProcessor2.db.querySingleItem(
                    "select user_avatar_file_name from g_users where del_flag = 0 and user_uid='" + userUid + "'");
            if (oldUserAvatarFileName != null) {
                // 旧头像文件路径
                String oldFilePath = BaseConf.getInstance().getDIR_USER_AVATAR_UPLOAD() + oldUserAvatarFileName;
                // 删除旧头像图片文件
                FileHelper.deleteFile(oldFilePath);

                // 旧头像缩略图文件路径
                String oldThumbFilePath = BaseConf.getInstance().getDIR_USER_AVATAR_UPLOAD()
                        + "th_" + oldUserAvatarFileName;
                // 删除旧头像缩略图片文件(@since 4.3)
                FileHelper.deleteFile(oldThumbFilePath);

                LoggerFactory.getLog().debug("[HTTP头像上传] 成功删除了用户的老头像：" + oldFilePath);
            }

            // 更新数据库，将该用户的头像文件名update到数据库哦
            LogicProcessor2.db.update("update g_users set user_avatar_file_name='" + fileName
                    + "' where del_flag = 0 and user_uid='" + userUid + "'", new Object[]{}, true);
        } catch (Exception e) {
            throw e;
        }
    }
}
